package com.neusoft.hifly.rpc.sms.service.impl;

import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;

import com.neusoft.hifly.core.log.Log;
import com.neusoft.hifly.core.pojo.ApiCode;
import com.neusoft.hifly.core.pojo.ApiResponse;
import com.neusoft.hifly.rpc.sms.config.AliyunConfig;
import com.neusoft.hifly.rpc.sms.dao.ISMSDao;
import com.neusoft.hifly.rpc.sms.domain.SMSObj;
import com.neusoft.hifly.rpc.sms.domain.SMSToDoDTO;
import com.neusoft.hifly.rpc.sms.domain.SendDetailDTO;
import com.neusoft.hifly.rpc.sms.service.ISMSService;

/**
 * Title: 短信服务
 * <p>
 * Description: 短信 Service
 * <p>
 * Copyright: 2019
 * <p>
 * Company: 东软汉枫
 *
 * @author lh_neu
 * @version 1.0.0
 */
@Service("smsService")
public class SMSServiceImpl implements ISMSService {

	@Autowired(required = false)
	private ISMSDao smsDao;

	@Autowired(required = false)
	private AliyunConfig aliyunConfig;

	/**
	 * 阿里大于发送短信
	 *
	 * @param phoneNumber
	 *            必填:待发送手机号,如果需要查询国际短信,号码前需要带上对应国家的区号
	 * @param templateCode
	 *            必填:短信模板-可在短信控制台中找到
	 * @param templateParam
	 *            可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为{\"name\":\"Tom\", \"code\":\"123\"}
	 * @return 是否成功
	 */
	@Override
	public boolean sendByAliyun(String phoneNumber, String templateCode, Map<String, String> templateParam) {
		if (StringUtils.isEmpty(phoneNumber) || StringUtils.isEmpty(templateCode)) {
			return false;
		}

		SendDetailDTO smsVO = new SendDetailDTO(aliyunConfig.getAccessKeyId(), aliyunConfig.getAccessKeySecret(),
				aliyunConfig.getSignName());
		smsVO.setPhoneNumber(phoneNumber);
		smsVO.setTemplateCode(templateCode);
		smsVO.setTemplateParam(templateParam);

		final ApiResponse<Object> result = smsDao.sendByAliyun(smsVO);

		if (result.getCode() == ApiCode.ERROR.getCode()) {
			Log.error(result.getMessage());
			return false;
		}

		return true;
	}

	/**
	 * 发送短信
	 *
	 * @param organLogicId
	 *            租户逻辑ID
	 * @param sender
	 *            发送者
	 * @param receiver
	 *            接收者的手机号码
	 * @param message
	 *            发送的信息内容
	 * @return 返回 如果发送成功返回true 否则返回false
	 */
	@Override
	public boolean sendMessage(final long organLogicId, final String sender, final String receiver,
			final String message) {
		if (StringUtils.isEmpty(receiver) || StringUtils.isEmpty(message)) {
			return false;
		}

		final ApiResponse<Object> result = smsDao
				.sendByGateway(new SMSToDoDTO(organLogicId, sender, receiver, message));

		if (result.getCode() == ApiCode.ERROR.getCode()) {
			Log.error(result.getMessage());
			return false;
		}

		return true;
	}

	/**
	 * 发布订阅模式
	 *
	 * @param pushObj
	 *            对象
	 */
	@EventListener
	private void handlerSMSEvent(final SMSToDoDTO pushObj) {
		final ApiResponse<Object> result = smsDao.sendByGateway(pushObj);
		if (result.getCode() == ApiCode.ERROR.getCode()) {
			Log.error(result.getMessage());
		}
	}

	/**
	 * 发布订阅模式
	 *
	 * @param pushObj
	 *            对象
	 */
	@EventListener
	private void handlerSMSEvent(final SMSObj pushObj) {
		sendByAliyun(pushObj.getPhoneNumber(), pushObj.getTemplateCode(), pushObj.getTemplateParam());
	}

}
